package com.rabbiter.hospital.controller;

import com.rabbiter.hospital.pojo.Bed;
import com.rabbiter.hospital.service.BedService;
import com.rabbiter.hospital.utils.ResponseData;
import com.rabbiter.hospital.utils.TodayUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("bed")
public class BedController {
    @Autowired
    private BedService bedService;

    /**
     * 查找所有空床位
     * 通过发送请求来获取当前所有空闲的床位信息
     * 主要用于展示哪些床位是可以被占用的
     */
    @RequestMapping("findNullBed")
    public ResponseData findNullBed() {
        // 返回成功响应，包含所有空床位信息
        return ResponseData.success("查找所有空床位成功", this.bedService.findNullBed());
    }


    /**
     * 增加床位信息
     * 通过调用床服务（bedService）来更新床位信息，如果更新成功，则返回成功响应数据；否则返回失败响应数据
     * @param bed 床位对象，包含需要更新的床位信息
     * @return ResponseData对象，包含操作结果和相应的消息
     */
    @RequestMapping("updateBed")
    public ResponseData updateBed(Bed bed) {
        // 调用床服务的更新方法，尝试增加床位信息
        if (this.bedService.updateBed(bed)) {
            // 如果增加成功，返回成功响应，并附带成功消息
            return ResponseData.success("增加床位成功！");
        }
        // 如果增加失败，返回失败响应，并附带失败消息
        return ResponseData.fail("增加床位失败！");
    }

    /**
     * 根据患者ID查询住院信息
     * @param pId 患者ID，用于查询特定患者的住院信息
     * @return ResponseData 包含查询结果的响应数据，成功时包含住院信息
     */
    @RequestMapping("findBedByPid")
    public ResponseData findBedByPid(@RequestParam(value = "pId") int pId) {
        // 返回根据患者ID查询住院信息的结果
        return ResponseData.success("根据pId查询住院成功", this.bedService.findBedByPid(pId));
    }

    /**
     * 分页模糊查询所有床位信息
     * @param pageNumber 页码
     * @param size       每页大小
     * @param query      模糊查询的关键字
     * @return 包含所有床位信息的响应数据
     */
    @RequestMapping("findAllBeds")
    public ResponseData findAllBeds(int pageNumber, int size, String query) {
        // 返回分页模糊查询的所有床位信息
        return ResponseData.success("返回所有床位信息成功", this.bedService.findAllBeds(pageNumber, size, query));
    }

    /**
     * 根据id查找床位
     * 该方法通过接收床位ID，向客户端返回床位信息
     * 主要用于展示如何通过ID查询床位，是系统床务管理的一部分
     * @param bId 床位的唯一标识符
     * @return 包含根据id查找床位结果的响应数据对象
     */
    @RequestMapping("findBed")
    public ResponseData findBed(int bId) {
        return ResponseData.success("根据id查找床位成功", this.bedService.findBed(bId));
    }

    /**
     * 增加床位信息
     * 通过调用bedService中的addBed方法来增加床位信息，并根据操作结果返回相应的响应数据
     * @param bed 床位对象，包含要增加的床位的所有必要信息
     * @return ResponseData 包含操作结果的信息和状态
     */
    @RequestMapping("addBed")
    @ResponseBody
    public ResponseData addBed(Bed bed) {
        Boolean bo = this.bedService.addBed(bed);
        if (bo) {
            return ResponseData.success("增加床位信息成功");
        }
        return ResponseData.fail("增加床位信息失败！床号或已被占用");
    }

    /**
     * 删除床位信息
     * @param bId 床位的唯一标识符
     * @return 返回删除操作的结果，成功或失败
     */
    @RequestMapping("deleteBed")
    public ResponseData deleteBed(@RequestParam(value = "bId") int bId) {
        // 调用bedService中的deleteBed方法尝试删除床位信息
        Boolean bo = this.bedService.deleteBed(bId);
        // 根据deleteBed方法的返回值判断删除操作是否成功
        if (bo) {
            // 删除成功，返回成功消息
            return ResponseData.success("删除床位信息成功");
        }
        // 删除失败，返回失败消息
        return ResponseData.fail("删除床位信息失败");
    }

    /**
     * 清空床位信息
     * 该方法用于清空特定床位的信息。通过调用bedService的emptyBed方法，
     * 尝试清空指定床位的信息。如果清空操作成功，返回成功消息；
     * 否则，返回失败消息。
     * @param bId 床位的标识符，指示需要清空信息的床位
     * @return ResponseData对象，包含操作结果和提示信息
     */
    @RequestMapping("emptyBed")
    public ResponseData emptyBed(int bId) {
        if (this.bedService.emptyBed(bId)) return ResponseData.success("清空床位信息成功");
        return ResponseData.fail("清空床位信息失败");
    }

    /**
     * 统计今天住院人数
     * 通过调用TodayUtil工具类获取当前日期的格式化字符串，以便统计从今日起住院的患者数量
     * 使用@，RequestMapping注解，指定处理的HTTP请求路径为"bedPeople"，从而可以通过HTTP请求访问该方法
     * 方法返回一个ResponseData对象，其中包含了通过调用bedService的bedPeople方法统计的今天住院人数信息
     * 这个方法不接受任何参数输入
     * @return ResponseData 包含统计今天住院人数结果的响应数据
     */
    @RequestMapping("bedPeople")
    public ResponseData bedPeople() {
        // 获取当前日期的格式化字符串，用于查询条件
        String bStart = TodayUtil.getTodayYmd();
        // 返回统计结果，包含今天住院的人数
        return ResponseData.success("统计今天住院人数成功", this.bedService.bedPeople(bStart));
    }

}
